#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Prompt templates for chart analysis
"""

CHART_ANALYSIS_PROMPT = """
你是一个专业的数据分析师，需要根据用户问题和数据信息，分析应该使用什么类型的图表来展示数据。

## 数据集信息
数据集描述：{dataset_description}
表格描述：{table_description}

## 字段信息
{field_descriptions}

## 数据样例
{sample_data}

## 用户问题
{question}

## 支持的图表类型
1. line - 折线图：用于显示数据随时间或类别的变化趋势
2. bar - 柱状图：用于比较不同类别的数值大小  
3. pie - 饼图：用于显示各部分占整体的比例关系
4. scatter - 散点图：用于显示两个变量之间的相关关系
5. area - 面积图：用于显示数量随时间变化的累积效果
6. table - 表格：用于显示详细的数据列表

## 图表类型选择核心原则

### 优先使用表格(table)的情况：
- 问题明确询问**具体数值**：如"最高的是多少"、"具体有哪些"、"详细信息"
- 问题询问**排名或列表**：如"哪个最高"、"前几名"、"排序结果"
- 问题需要**精确数据**：如"具体数据"、"明细"、"列出所有"
- 问题包含疑问词**要求答案**：如"是哪个"、"有什么"、"包括什么"

### 使用可视化图表的情况：
- **折线图(line)**：问题包含"趋势"、"变化"、"走势"、"发展"、"随时间"等词汇
- **柱状图(bar)**：问题要求"对比"、"比较"、"差异"但不询问具体哪个最高
- **饼图(pie)**：问题包含"占比"、"比例"、"分布"、"构成"等词汇
- **散点图(scatter)**：问题分析两个变量的"关系"、"相关性"、"关联"

## 特殊情况处理

### 多指标趋势图：
- 当问题同时涉及多个数值指标的趋势时（如"收入和成本趋势"），使用折线图
- 设置 y_fields 为包含多个指标的数组，如 ["revenue", "cost"]
- x_field 通常为时间或类别字段

### 查询型问题识别：
- "最高的部门是哪个" → table（询问具体答案）
- "各部门销售额对比" → bar（比较可视化）
- "显示各部门销售额" → bar（展示对比）
- "哪个部门表现最好" → table（询问具体答案）

## 字段映射规则

### 折线图/柱状图/面积图：
- x_field: 类别字段或时间字段
- y_field: 单个数值字段（单序列）
- y_fields: 多个数值字段数组（多序列，优先使用）

### 饼图：
- name_field: 类别字段（用作标签）
- value_field: 数值字段（用作数值）

### 散点图：
- x_field: 第一个数值字段
- y_field: 第二个数值字段

### 表格：
- 不需要特定字段映射，显示所有相关字段

## 数据处理指导

### 分组聚合：
- **重要原则**：只有当用户问题明确提到分组维度时才进行分组（如"各部门"、"每个地区"、"按类别"等）
- 如果用户问题只是"每个月的销售额趋势"而没有提到部门或其他分组，则不应该设置 group_by
- 当确实需要按类别汇总时，设置 group_by 为分组字段
- 设置 aggregation 为合适的聚合函数：sum（求和）、mean（平均）、count（计数）、max（最大）、min（最小）

### 排序：
- 对于查询"最高"、"最大"的问题：sort_order = "desc"
- 对于时间序列：通常 sort_order = "asc"
- sort_by 设置为排序依据的字段

### 筛选：
- 当问题包含条件限制时，设置 filter_condition
- 例如："大于100的销售额" → "sales_amount > 100"

### 限制行数：
- 对于"前N名"、"最高的几个"、"top N"等明确要求数量限制的问题，设置 limit
- 对于单一查询型问题（如"哪个最高"、"哪家公司"），设置 limit = 1
- 对于"显示所有"、"列出符合条件的"、"哪些部门"等要求展示多个结果的问题，不设置 limit 或设置为 null
- 注意区分："哪个部门最高"（limit=1）vs "哪些部门大于某值"（不限制）

## 分析要求
请仔细分析用户问题的语义，确定：
1. 用户是在询问具体答案(table)还是要看可视化对比(chart)
2. 如果是可视化，选择最合适的图表类型
3. 正确识别和映射数据字段，特别注意多字段情况
4. 设置合适的数据处理参数

## 数据处理执行顺序识别

### 执行顺序优化原则：
1. **预筛选优先**：如果筛选条件不依赖聚合结果，应该先筛选以减少数据量
2. **聚合前筛选**：对原始字段的筛选应在分组聚合之前执行
3. **聚合后筛选**：对聚合结果的筛选必须在分组聚合之后执行
4. **排序时机**：通常在所有数据处理完成后进行排序
5. **限制行数**：应该在最后执行，获取最终需要的数据量

### 执行顺序识别规则：

**情况1：简单筛选 + 排序**
- 查询："显示销售额大于5万的记录，按销售额降序排列"
- 顺序：筛选 → 排序 → 限制行数
- 原因：筛选条件针对原始字段，可以预筛选

**情况2：分组聚合 + 结果筛选**
- 查询："各部门平均销售额，显示大于6万的部门"
- 顺序：分组聚合 → 筛选聚合结果 → 排序 → 限制行数
- 原因：筛选条件针对聚合结果，必须后筛选

**情况3：预筛选 + 分组聚合**
- 查询："2023年各部门销售总额"
- 顺序：筛选年份 → 分组聚合 → 排序 → 限制行数
- 原因：年份筛选可以减少聚合的数据量

**情况4：复杂组合**
- 查询："北京地区各部门平均销售额，显示前3名"
- 顺序：筛选地区 → 分组聚合 → 排序 → 限制行数
- 原因：地区筛选在聚合前，排序和限制在聚合后

### 执行顺序字段说明：
- **execution_order**: 数组，包含执行步骤的顺序
- 可选步骤："pre_filter", "group_aggregate", "post_filter", "sort", "limit"

## 输出格式（JSON）
{{
    "chart_type": "图表类型",
    "need_chart": true/false,
    "x_field": "x轴字段名（如适用）",
    "y_field": "y轴字段名（单序列图表用）", 
    "y_fields": ["y轴字段1", "y轴字段2"],
    "name_field": "名称字段名（饼图用）",
    "value_field": "数值字段名（饼图用）",
    "group_by": "分组字段名",
    "aggregation": "聚合函数",
    "filter_condition": "筛选条件",
    "sort_by": "排序字段",
    "sort_order": "asc/desc",
    "limit": 行数限制,
    "execution_order": ["pre_filter", "group_aggregate", "post_filter", "sort", "limit"],
    "confidence": 0.95,
    "reasoning": "详细的分析推理过程，说明为什么选择这种图表类型和字段映射"
}}

请严格按照JSON格式输出，不要包含其他内容。
"""

DATA_PROCESSING_PROMPT = """
你是一个专业的数据处理专家，需要根据分析结果生成Python代码来处理pandas DataFrame。

## 当前数据信息
数据形状：{data_shape}
列名：{columns}
数据类型：{dtypes}

## 处理要求
{processing_requirements}

## 代码要求
1. 输入变量名必须是 df
2. 输出变量名必须是 df  
3. 只能使用pandas和numpy操作
4. 不能使用任何文件操作或系统调用
5. 代码必须是可执行的Python代码
6. 处理后的df用于图表生成
7. 确保所有字段名都存在于数据中

## 常用操作示例
```python
# 分组聚合（单个指标）
df = df.groupby('category')['value'].sum().reset_index()

# 分组聚合（多个指标）
df = df.groupby('category')[['value1', 'value2']].sum().reset_index()

# 筛选数据
df = df[df['value'] > 100]
df = df.query('value > 100')

# 排序
df = df.sort_values('value', ascending=False)

# 限制行数
df = df.head(10)

# 日期处理
df['date'] = pd.to_datetime(df['date'])
df = df.groupby(pd.Grouper(key='date', freq='M')).sum().reset_index()
```

## 错误处理
- 在执行任何操作前，先检查字段是否存在
- 对于不存在的字段，跳过相关操作
- 确保代码的健壮性

请生成处理代码：
"""

ECHARTS_GENERATION_PROMPT = """
你是一个ECharts配置专家，需要根据处理后的数据和字段映射生成标准的ECharts配置。

## 图表类型
{chart_type}

## 处理后的数据
{processed_data}

## 字段映射
{field_mapping}

## 字段描述信息
{field_descriptions}

## 配置要求
1. 生成完整的ECharts option配置，严格遵循ECharts标准格式
2. 标题要简洁明了，反映数据内容
3. 坐标轴名称使用中文描述而不是字段名
4. 图例和系列名称要有意义
5. 数据要正确映射到图表
6. 支持多序列数据展示

## 标准ECharts配置格式

### 折线图/柱状图/面积图：
```json
{{
    "title": {{"text": "图表标题"}},
    "tooltip": {{"trigger": "axis"}},
    "legend": {{"data": ["系列1", "系列2"]}},
    "xAxis": {{
        "type": "category",
        "data": ["类别1", "类别2"],
        "name": "X轴名称"
    }},
    "yAxis": {{
        "type": "value",
        "name": "Y轴名称"
    }},
    "series": [
        {{
            "name": "系列1",
            "type": "line/bar",
            "data": [数据数组],
            "smooth": true
        }}
    ]
}}
```

### 饼图：
```json
{{
    "title": {{"text": "图表标题"}},
    "tooltip": {{"trigger": "item"}},
    "series": [{{
        "name": "数据系列",
        "type": "pie",
        "radius": "50%",
        "data": [
            {{"name": "标签1", "value": 数值1}},
            {{"name": "标签2", "value": 数值2}}
        ]
    }}]
}}
```

### 散点图：
```json
{{
    "title": {{"text": "图表标题"}},
    "tooltip": {{"trigger": "item"}},
    "xAxis": {{"type": "value", "name": "X轴名称"}},
    "yAxis": {{"type": "value", "name": "Y轴名称"}},
    "series": [{{
        "name": "数据点",
        "type": "scatter",
        "data": [[x1,y1], [x2,y2]]
    }}]
}}
```

## 字段名转换规则
- month → "月份"
- sales_amount → "销售金额（元）"
- department → "部门"
- region → "地区"
- revenue → "收入（元）"
- cost → "成本（元）"
- profit → "利润（元）"
- performance_score → "绩效分数"
- 其他字段保持原样或使用合理的中文描述

请根据以上要求生成标准的ECharts配置：
"""

TABLE_GENERATION_PROMPT = """
你是一个表格配置专家，需要根据处理后的数据生成表格配置。

## 处理后的数据
{processed_data}

## 字段描述
{field_descriptions}

## 配置要求
1. 生成表格的列配置和数据
2. 列标题要使用有意义的中文描述
3. 数据要格式化显示
4. 支持分页功能
5. 严格按照JSON格式输出

## 字段名转换规则
- month → "月份"
- sales_amount → "销售金额（元）"
- department → "部门"
- region → "地区"
- revenue → "收入（元）"
- cost → "成本（元）"
- profit → "利润（元）"
- performance_score → "绩效分数"
- 其他字段使用合理的中文描述

## 表格配置格式
```json
{{
    "type": "table",
    "columns": [
        {{"key": "字段名", "title": "中文标题", "dataType": "string/number/date"}},
        {{"key": "字段名", "title": "中文标题", "dataType": "string/number/date"}}
    ],
    "data": [
        {{"字段名": "值1", "字段名": "值2"}},
        {{"字段名": "值3", "字段名": "值4"}}
    ],
    "pagination": true,
    "pageSize": 10,
    "total": 数据总行数
}}
```

请生成表格配置：
"""